package structural.facade;

/**
 * 门面模式
 * 就是化零为整；引入一个中介类，把各个分散的功能组合成一个整体，只对外暴露一个统一的接口；
 *
 * 使用场景
 * A：简化子系统复杂性时。
 * B：监控所有子系统时；通过门面控制了入口，可以统一监控；
 * C：希望封装和隐藏子系统时；
 * D：两历史系统进行改造并打通关系时；
 *
 * 例子：SpringApplicationContext;
 */


class ModuleA{
    public void action(){
        System.out.println("action------> ModuleA");
    }
}


class ModuleB{
    public void action(){
        System.out.println("action------> ModuleB");
    }
}


class ModuleC{
    public void action(){
        System.out.println("action------> ModuleC");
    }
}

/**
 * 侧重于整合功能，简化用户调用
 */
class Facade{
    private ModuleA moduleA = new ModuleA();
    private ModuleB moduleB = new ModuleB();
    private ModuleC moduleC = new ModuleC();

    public void setModuleA(ModuleA moduleA) {
        this.moduleA = moduleA;
    }

    public void setModuleB(ModuleB moduleB) {
        this.moduleB = moduleB;
    }

    public void setModuleC(ModuleC moduleC) {
        this.moduleC = moduleC;
    }

    public void actionA(){
        System.out.println("门面处理");
        //其他处理
        moduleA.action();
    }
    public void actionB(){
        System.out.println("门面处理");
        //其他处理
        moduleB.action();
    }
    public void actionC(){
        System.out.println("门面处理");
        //其他处理
        moduleC.action();
    }
}


class Test{
    public static void main(String[] args) {
        Facade facade = new Facade();

        facade.actionA();
        facade.actionB();
        facade.actionC();
    }
}